# -*- coding: utf-8 -*-

#################
#    Imports    #
#################
from Utilities import *
from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker


Base = declarative_base()


class DatabaseMngr():
    """
    Database manager class
    Manages all tables from our project
    """

    # Engine
    engine = None

    # Current session
    session = None

    def __init__(self):
        """
        Constructor, initializes the database
        """

        self.engine = create_engine('sqlite:///' + module_abspath('data', 'dados.db'),
                                    encoding='utf8',
                                    echo=False)
        Base.metadata.drop_all(self.engine)
        Base.metadata.create_all(self.engine)

        Session = sessionmaker(bind=self.engine)
        self.session = Session()

    def insert_escola(self, data):
        """
        Insert a row in table escola
        data -- Array containing data to insert
        """

        row = Escola.insertnew(data)
        self.session.add(row);
        return row

    def commit(self):
        self.session.commit()


class Escola(Base):
    """
    Escola class, represents a SQL table
    """

    # Column enumeration
    IDX_CODINSTITUICAO = 0
    IDX_CODCURSO = 1
    IDX_INSTITUICAONOME = 2
    IDX_CURSO_NOME = 3
    IDX_GRAU = 4
    IDX_VAGAS = 5
    IDX_COLOCADOS = 6
    IDX_NOTACANDIDATURA = 7
    IDX_VAGASRESTANTES = 8

    # table name
    __tablename__ = 'escola'

    # Columns
    id = Column(Integer, primary_key=True)
    cod_instituicao = Column(String(4), nullable=False)
    cod_curso = Column(String(4), nullable=False)
    instituicao_nome = Column(String(255), nullable=False)
    curso_nome = Column(String(255), nullable=False)
    grau = Column(String(2))
    vagas = Column(Integer)
    colocados = Column(Integer)
    nota_candidatura = Column(DECIMAL(5.2))
    vagas_restantes = Column(Integer)

    def __init__(self, cod_instituicao, cod_curso, instituicao_nome, curso_nome, grau, vagas, colocados,
                 nota_candidatura, vagas_restantes):
        """
        Constructor, sets the table values
        """
        if isinstance(nota_candidatura, str):
            nota_candidatura = 0.0

        self.cod_instituicao = cod_instituicao
        self.cod_curso = cod_curso
        self.instituicao_nome = instituicao_nome
        self.curso_nome = curso_nome
        self.grau = grau
        self.vagas = vagas
        self.colocados = colocados
        self.nota_candidatura = nota_candidatura
        self.vagas_restantes = vagas_restantes

    def __repr__(self):
        """
        String representation of this class
        """
        return "Escola(%r, %r, %r, %r, %r, %i, %i, %f, %i)" % (self.cod_instituicao,
                                                               self.cod_curso,
                                                               self.instituicao_nome,
                                                               self.curso_nome,
                                                               self.grau,
                                                               self.vagas,
                                                               self.colocados,
                                                               self.nota_candidatura,
                                                               self.vagas_restantes)

    @staticmethod
    def insertnew(data):
        """
        Insert new row on table and return the class
        data -- Array containing data to insert
        """
        return Escola(data[Escola.IDX_CODINSTITUICAO],      # Codigo de instituição
                      data[Escola.IDX_CODCURSO],            # Codigo de curso
                      data[Escola.IDX_INSTITUICAONOME],     # Nome da instituição
                      data[Escola.IDX_CURSO_NOME],          # Nome do curso
                      data[Escola.IDX_GRAU],                # Grau
                      data[Escola.IDX_VAGAS],               # Vagas
                      data[Escola.IDX_COLOCADOS],           # Colocados
                      data[Escola.IDX_NOTACANDIDATURA],     # Nota de candidatura
                      data[Escola.IDX_VAGAS])               # Vagas
